\apendice

\chapter{Conjunto completo de instruções do RISCO}
\label{c:apendice_instrucoes}

Nas seções seguintes é detalhado o conjunto de instruções do RISCO.


\section{Instruções aritmético-lógicas}

São as instruções que realizam cálculos aritméticos ou lógicos nos seus
operandos, guardando o resultado em um dos registradores. O RISCO implementa
apenas 25 instruções deste tipo, das 32 possíveis de acordo com o campo C4..C0
da instrução. Elas são apresentadas na tabela \ref{tab:instr_arithlog}.

\begin{table}[hp]
\begin{center}
\begin{tabular}{ c | l | l | l }
  \textbf{Mnemônico} & \textbf{Semântica} & \textbf{Comentário} \\
  \hline
  
  \texttt{add} & DST $\leftarrow$ FT1 + FT2 & adição \\
  \texttt{addc} & DST $\leftarrow$ FT1 + FT2 + C & adição com carry \\
  \texttt{sub} & DST $\leftarrow$ FT1 + FT2 & subtração \\
  \texttt{subc} & DST $\leftarrow$ FT1 - FT2 - C & subtração com carry \\
  \texttt{subr} & DST $\leftarrow$ FT2 - FT1 & subtração reversa \\
  \texttt{subrc} & DST $\leftarrow$ FT2 - FT1 - C & subtração reversa com carry
  \\
  
  \texttt{and} & DST $\leftarrow$ FT1 and FT2 & E lógico \\
  \texttt{or} & DST $\leftarrow$ FT1 or FT2 & OU lógico \\
  \texttt{xor} & DST $\leftarrow$ FT1 xor FT2 & OU exclusivo lógico \\
  
  \texttt{rll} & DST $\leftarrow$ FT1 rot FT2 & rotação lógica à esq. \\
  \texttt{rllc} & DST $\leftarrow$ FT1 rot FT2 c/ C & rotação lógica à esq. c/
  carry \\
  \texttt{rla} & DST $\leftarrow$ FT1 rot FT2 & rotação aritmética à esq. \\
  \texttt{rlac} & DST $\leftarrow$ FT1 rot FT2 c/ C & rotação aritmética à esq.
  c/ carry \\
  
  \texttt{rrl} & DST $\leftarrow$ FT1 rot FT2 & rotação lógica à dir. \\
  \texttt{rrlc} & DST $\leftarrow$ FT1 rot FT2 c/ C & rotação lógica à dir. c/
  carry \\
  \texttt{rra} & DST $\leftarrow$ FT1 rot FT2 & rotação aritmética à dir. \\
  \texttt{rrac} & DST $\leftarrow$ FT1 rot FT2 c/ C & rotação aritmética à dir.
  c/ carry \\
  
  \texttt{sll} & DST $\leftarrow$ FT1 desl FT2 & deslocamento lógico à esq. \\
  \texttt{sllc} & DST $\leftarrow$ FT1 desl FT2 c/ C & deslocamento lógico à
  esq. c/ carry \\
  \texttt{sla} & DST $\leftarrow$ FT1 desl FT2 & deslocamento aritmético à esq.
  \\
  \texttt{slac} & DST $\leftarrow$ FT1 desl FT2 c/ C & deslocamento aritmético à
  esq. c/ carry \\
  
  \texttt{srl} & DST $\leftarrow$ FT1 desl FT2 & deslocamento lógico à dir. \\
  \texttt{srlc} & DST $\leftarrow$ FT1 desl FT2 c/ C & deslocamento lógico à
  dir. c/ carry \\
  \texttt{sra} & DST $\leftarrow$ FT1 desl FT2 & deslocamento aritmético à dir.
  \\
  \texttt{srac} & DST $\leftarrow$ FT1 desl FT2 c/ C & deslocamento aritmético à
  dir. c/ carry 
  
\end{tabular}
\end{center}
\caption{Instruções aritmético-lógicas do RISCO \label{tab:instr_arithlog}}
\end{table}


\section{Instruções de acesso à memória}

São as instruções que realizam leitura ou escrita em uma posição da memória.
Toda instrução trabalha com um endereço de 4 bytes, indicando a posição de um
byte na memória. A tabela \ref{tab:instr_mem} descreve estas instruções.

\begin{table}[hp]
\begin{center}
\begin{tabular}{ c | l | l | l }
  \textbf{Mnemônico} & \textbf{Semântica} & \textbf{Comentário} \\
  \hline
  
  \texttt{ld} & DST $\leftarrow$ M[FT1 + FT2] & leitura simples \\
  \texttt{ldpri} & FT2 $\leftarrow$ FT2 + 1; DST $\leftarrow$ M[FT1 + FT2] &
  leitura e pré-incremento \\
  \texttt{ldpoi} & DST $\leftarrow$ M[FT1 + FT2]; FT2 $\leftarrow$ FT2 + 1 &
  leitura e pós-incremento \\
  \texttt{ldpod} & DST $\leftarrow$ M[FT1 + FT2]; FT2 $\leftarrow$ FT2 - 1 &
  leitura e pós-decremento \\
  
  \texttt{st} & M[FT1 + FT2] $\leftarrow$ DST & escrita simples \\
  \texttt{stpri} & FT2 $\leftarrow$ FT2 + 1; M[FT1 + FT2] $\leftarrow$ DST &
  escrita e pré-incremento \\
  \texttt{stpoi} & M[FT1 + FT2] $\leftarrow$ DST; FT2 $\leftarrow$ FT2 + 1 &
  escrita e pós-incremento \\
  \texttt{stpod} & M[FT1 + FT2] $\leftarrow$ DST; FT2 $\leftarrow$ FT2 - 1 &
  escrita e pós-decremento 
  
\end{tabular}
\end{center}
\caption{Instruções de acesso à memória do RISCO \label{tab:instr_mem}}
\end{table}


\section{Instruções de salto}

São instruções que implementam uma soma condicional em um registrador, não
necessariamente envolvendo R31 (PC). O esquema geral das instruções de salto é:

\begin{quote}
\begin{verbatim}
  jmp[cond] DST, FT1, FT2  <=>  se cond então DST <- FT1 + FT2  
\end{verbatim}
\end{quote}

Os sufixos indicando as possíveis condições de salto são apresentados na tabela
\ref{tab:instr_cond}.

\begin{table}[htbp]
\begin{center}
\begin{tabular}{ c | l }
  \textbf{Mnemônico} & \textbf{Comentário} \\
  \hline
  
  \texttt{ns} & número negativo \\
  \texttt{cs} & carry setado \\
  \texttt{os} & overflow \\
  \texttt{zs} & zero \\
  \texttt{ge} & maior ou igual \\
  \texttt{gt} & maior \\
  \texttt{eq} & igualdade \\
  \texttt{fl} & sempre falso \\
  \texttt{nn} & número não negativo \\
  \texttt{nc} & carry não setado \\
  \texttt{no} & não houve overflow \\
  \texttt{nz} & diferente de zero \\
  \texttt{lt} & menor \\
  \texttt{le} & menor ou igual \\
  \texttt{ne} & desigualdade
  
\end{tabular}
\end{center}
\caption{Sufixos de condição do RISCO \label{tab:instr_cond}}
\end{table}



\section{Instruções de chamada de sub-rotina}

São as instruções que agrupam, sob uma condição: decremento de registrador,
escrita em memória do valor do PC e salvo para outra instrução. Elas
implementam eficientemente o procedimento de chamada de sub-rotina no RISCO. O
esquema geral das instruções de chamada de subrotina é:

\begin{quote}
\begin{verbatim}
  sr[cond] DST, FT1, FT2  <=> se cond então:
                                  DST <- DST - 1
                                  M[DST] <- PC
                                  PC <- FT1 + FT2
\end{verbatim}
\end{quote}

A instrução pode ser utilizada com as condições da tabela \ref{tab:instr_cond},
assim como as instruções de salto. Note que não há uma instrução específica para
o retorno de subrotina. O retorno se dá com uma instrução ``\texttt{ldpoi \$pc,
[\$zero + \$sp]}''. 
